#include<iostream>
#include"Comm.hpp"
//与管道的最大本质区别是它是一个内存空间，不会访问时候没数据阻塞，也没有任何保护机制，有就读管你数据完不完整，整体都是可访问操作的数据
int main()
{
    shm.CreateSharedM();
    sleep(1);
    shm.AttachM();
    Data*strinfo=(Data*)shm.GetAddr();
    printf("%p\n",strinfo);
//通信


   //等管道有消息才通信
    NamePipe namepipe_w(OPENWITHWRITE);
    while(1)
    {
        strncpy(strinfo->image,"heiheihei",sizeof(strinfo->image));
        strncpy(strinfo->lasttime,GetCurrentTime().c_str(),sizeof(strinfo->lasttime));
        strncpy(strinfo->status,"uptodate",sizeof(strinfo->status));

        std::cout<<"clinet:write"<<namepipe_w.WritePipe("done")<<std::endl;
        sleep(3);
        //这三个 strncpy ​​不是原子操作​​，Server 可能在 image 写入完成(可能也未完成）但 status 未写入时读取数据，导致读到部分更新。
        
        
        
        //对内存写入少于一定量是原子的吗？：
        /*​​CPU 架构的影响​​：
        在 x86/x64 上，​​对齐的 1/2/4/8 字节写入是原子的​​（如 int、short）。
        但 strncpy ​​仍然不是原子操作​​，因为它是多次单字节写入。
        ​​共享内存的特殊性​​：
共享内存的写入会直接反映到其他进程，​​没有缓存一致性协议​​（不像多线程的 std::atomic）。
即使写入 1 字节，其他进程 也可能看到 ​​中间状态​​。*/
    }
    

    shm.DeM();
}